13-4 LO

我們可用 isstruct 指令來測試某個變數是否為結構陣列,如下

Example 1: 13-結構陣列/isstruct01.ms = struct('name', {'Tim', 'Ann'}, 'scores', {[1 3 5 ],[2 4 6]}); isstruct(s) ans = 1

isfield 指令則可用於測試某結構陣列是否含一特定欄位,例如:

Example 2: 13-結構陣列/isfield01.ms = struct('name', {'Tim', 'Ann'}, 'scores', {[1 3 5 ],[2 4 6]}); fprintf('isfield(s, ''name'') = %d\n', isfield(s, 'name')); fprintf('isfield(s, ''height'') = %d\n', isfield(s, 'height')); isfield(s, 'name') = 1 isfield(s, 'height') = 0

在上例中,因 s 並不包含“height”的欄位,故回傳數值 0。

我們可用 cell2struct 指令來將異質陣列轉換成結構陣列,例如:

Example 3: 13-結構陣列/cell2struct01.mfields = {'name', 'age'}; values = {'Tim', 9; 'Annie', 6}; s = cell2struct(values, fields, 2); s(1) % 印出第一筆資料 s(2) % 印出第二筆資料 ans = name: 'Tim' age: 9 ans = name: 'Annie' age: 6

在上例中,運算式「s = cell2struct(values, fields, 2)」代表指令 cell2struct 將根據陣列變數 fields 的資料為欄位名稱,並以 values 的第二個維度來對應欄位名稱 fields,來產生一個結構陣列 s。如果以 values 的第一個維度來對應欄位名稱 fields,得到的結果如下:

Example 4: 13-結構陣列/cell2struct02.mfields = {'name', 'age'}; values = {'Tim', 9; 'Annie', 6}; s = cell2struct(values, fields, 1); s(1) % 印出第一筆資料 s(2) % 印出第二筆資料 ans = name: 'Tim' age: 'Annie' ans = name: 9 age: 6

cell2struct 指令特別適用於資料庫的資料。通常我們利用「資料庫工具箱」(Database Toolbox)從資料庫中取出的資料,預設的資料型態是異值陣列,利用 cell2struct 指令,我們就可以一次將它改為更容易處理的結構陣列。

Hint
在 MATLAB 中,若指令形式為 A2B,大部代表其功能為將變數由 A 型式轉換為 B 型式,其中的數字「2」即英文「to」的同音字,類似的指令還有 int2str、num2str、str2num、str2mat、mat2str、bin2dec、hex2dec、hex2num、base2dec等。

dir 指令可傳回一結構陣列,包含現在目錄(或資料夾)下的各種資訊,例如:

Example 5: 13-結構陣列/dir01.mdirinfo = dir(matlabroot) % 字串變數 matlabroot 代表 MATLAB 根目錄 dirinfo = 29x1 <a href="matlab:helpPopup struct" style="font-weight:bold">struct</a> array with fields: name date bytes isdir datenum

由上可知,dirinfo 為一結構陣列,內含在 MATLAB 根目錄下所含檔案或其他目錄的資訊,即其名稱(name),產生日期(date),大小(bytes),及是否為目錄(isdir)等。


MATLAB程式設計:入門篇